﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LJH.SmartAlarmSystem.UControls
{
    /// <summary>
    /// 自定义参数文本框事件参数类，包含参数值信息
    /// </summary>
    public class ParameterTextBoxArgs : EventArgs
    {
        /// <summary>
        /// 获取或设置参数数值
        /// </summary>
        public decimal DataValue { get; set; }

        /// <summary>
        /// 初始化 ParameterTextBoxArgs 类的新实例
        /// </summary>
        /// <param name="val">参数数值</param>
        public ParameterTextBoxArgs(decimal val)
        {
            DataValue = val;
        }
    }

    /// <summary>
    /// 自定义参数文本框控件，继承自Label，用于显示带单位的参数值
    /// 支持双击事件触发参数编辑，并自动格式化显示数值和单位
    /// </summary>
    [DefaultEvent("ParameterTextBoxDClick")]
    [ToolboxItem(true)] // 确保控件显示在工具箱中
    public partial class UParameterTextBox : Label
    {
        /// <summary>
        /// 初始化 UParameterTextBox 类的新实例
        /// </summary>
        public UParameterTextBox()
        {
            InitializeComponent();
            this.DoubleClick += UParameterTextBox_DoubleClick;
            this.AutoSize = false; // 通常参数文本框需要固定大小
            this.Font = new Font("微软雅黑", 9F);
        }

        #region 拓展属性：参数数值、参数单位
        /// <summary>
        /// 获取或设置参数值
        /// 设置时会自动更新显示文本，格式为"数值 单位"
        /// </summary>
        [DefaultValue(typeof(decimal), "0m")]
        [Description("参数数值，支持小数")]
        public decimal Value
        {
            get { return _value; }
            set
            {
                if (_value != value)
                {
                    _value = value;
                    UpdateDisplayText();
                }
            }
        }
        private decimal _value = 0m;

        /// <summary>
        /// 获取或设置参数单位
        /// 设置时会自动更新显示文本，格式为"数值 单位"
        /// </summary>
        [DefaultValue(typeof(string), "")]
        [Description("参数单位（如：℃、kPa等）")]
        public string Unit
        {
            get { return _unit; }
            set
            {
                if (_unit != value)
                {
                    _unit = value;
                    UpdateDisplayText();
                }
            }
        }
        private string _unit = string.Empty;

        /// <summary>
        /// 获取或设置参数名称
        /// 用于标识参数的名称，不影响显示
        /// </summary>
        [DefaultValue(typeof(string), "")]
        [Description("参数的标识名称")]
        public string ParameterName
        {
            get { return _parameterName; }
            set { _parameterName = value; }
        }
        private string _parameterName = string.Empty;
        #endregion

        /// <summary>
        /// 更新控件显示的文本内容
        /// 格式为"数值 单位"
        /// </summary>
        private void UpdateDisplayText()
        {
            base.Text = $"{_value} {_unit}".Trim();
        }

        /// <summary>
        /// 获取控件的文本内容（重写基类属性）
        /// 实际显示内容由Value和Unit属性决定
        /// </summary>
        [Browsable(false)] // 设计器中隐藏
        public override string Text
        {
            get => base.Text;
            // 可以添加setter以支持直接设置文本，但需要解析出Value和Unit
        }

        /// <summary>
        /// 获取文本对齐方式（重写基类属性，固定为居中）
        /// </summary>
        [Browsable(false)] // 设计器中隐藏
        public override ContentAlignment TextAlign
        {
            get => ContentAlignment.MiddleCenter;
            // 可以添加setter并忽略设置，或抛出异常
        }

        /// <summary>
        /// 当双击参数文本框时发生
        /// 用于触发参数编辑操作
        /// </summary>
        [Description("双击参数文本框时触发的事件")]
        [Category("行为")] // 在属性窗口中分组
        public event EventHandler<ParameterTextBoxArgs> ParameterTextBoxDClick;

        /// <summary>
        /// 处理双击事件
        /// 触发ParameterTextBoxDClick事件，传递当前参数值
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e">事件参数</param>
        private void UParameterTextBox_DoubleClick(object sender, EventArgs e)
        {
            ParameterTextBoxDClick?.Invoke(this, new ParameterTextBoxArgs(Value));
        }
    }
}
